package com.ai;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 马宇航
 * @Description: 反射
 * @DateTime: 25/09/05/星期五 15:04
 * @Component: 成都蜗牛学苑
 **/
public class ReversClass {
    // 这里定义一个：Map集合，key是方法名字，value是方法的类对象
    private static Map<String,Object> methodMap = new HashMap<>();
    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        //必须把你本地的方法和对应的对象，注册到容器中，AI回复的函数，才知道是哪个对象的函数
        methodMap.put("ask",new WeatherAsk());
        ReversClass reversClass = new ReversClass();
        //第一个参数不对，因为ai无法回复对象。只会告诉你对象的名字
        reversClass.ai_result("ask","成都");
    }
    /**
     * 模拟，AI回复的文本消息，调用指定的方法，传递参数
     * ChangeLog : 1. 创建 (25/09/05/星期五 15:07 [马宇航]);
     * 下面的两个参数，都是来自于AI回复的JSON内容中提供的。
     * @param method 要调用的该方法
     * @param args 要调用的方法所需要的参数
     * @return void
    */
    public void ai_result(String method,Object ... args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        //1.先利用对象，拿到它的类对象 （继承了Class类的对象，再JVM中它是唯一的）
        Object o = methodMap.get(method);
        //3.拿到方法的类对象信息 String.class 需要用 args来反推类型
        Method methodClass = o.getClass().getDeclaredMethod(method, String.class);
        //4.调用方法(如果是个私有）
        methodClass.setAccessible(true);
        //5.调用方法 反向调用方法，以前是 对象.方法(参数）；  方法类对象.invoke(对象,参数);
        String methodRef = (String) methodClass.invoke(o, args);
        System.out.println(methodRef);
    }
}
